# -*- coding: utf-8 -*-
"""
Created on Fri Feb 25 19:01:41 2022

@author: lizhuang
"""

# -*- coding: utf-8 -*-
"""
Created on Wed Jan  5 23:11:12 2022

@author: lizhuang
"""

import numpy as np
import pandas as pd
#import sviewgui.sview as sv
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
import sys
from scipy.optimize import root,fsolve
sys.path.append("../主界面")
from 绘图 import 绘图
class 程序400t():
    def __init__(self,冲压能力=1000,连续行程数=30,断续行程数小=10,断续行程数大=20, \
                 能力发生点=13,行程长=400,主齿轮偏心半径=150,支点位置m=1250,支点位置p=-100, \
                受力点偏置距离=0,连杆长度b=893,连杆长度c=887,连杆长度g=993,连杆长度h=885):
       self.P_n=冲压能力#t c3
       self.spm=连续行程数#r/min
       self.断续行程数小=断续行程数小#cpm
       self.断续行程数大=断续行程数大#cpm
       self.sf=能力发生点#mm
       self.行程长=行程长#mm
       self.主齿轮偏心半径=主齿轮偏心半径#mm c9
       self.支点位置m=支点位置m#c10
       self.支点位置p=支点位置p#c11
       self.受力点偏置距离=受力点偏置距离#c12
       self.连杆长度b=连杆长度b#c13
       self.连杆长度c=连杆长度c#c14
       self.连杆长度g=连杆长度g#c15 
       self.连杆长度h=连杆长度h#c16
       self.thea=np.pi/2
       self.co_dr=np.pi/180;
       self.co_rd=180/np.pi;
       self.角速度=self.spm*2*np.pi/60#弧度/s
       self.初始=[290*self.co_dr,50*self.co_dr,130*self.co_dr,250*self.co_dr,250*self.co_dr,(self.连杆长度g+self.连杆长度h-100)]
    def 位移方程(self,x):#x6s是mns x7是s
       return np.array([self.主齿轮偏心半径*np.cos(self.thea)+self.连杆长度b*np.cos(x[1])-self.连杆长度c*np.cos(x[2])-self.支点位置m, \
           self.主齿轮偏心半径*np.sin(self.thea)+self.连杆长度b*np.sin(x[1])-self.连杆长度c*np.sin(x[2])-self.支点位置p, \
           self.连杆长度b*np.cos(x[1])+self.辅助连杆长()*np.cos(x[4])-self.连杆长度g*np.cos(x[3]), \
           self.连杆长度b*np.sin(x[1])+self.辅助连杆长()*np.sin(x[4])-self.连杆长度g*np.sin(x[3]), \
           self.主齿轮偏心半径*np.cos(self.thea)+self.连杆长度h*np.cos(x[0])+self.连杆长度g*np.cos(x[3])-x[5]*np.cos(270*np.pi/180), \
           self.主齿轮偏心半径*np.sin(self.thea)+self.连杆长度h*np.sin(x[0])+self.连杆长度g*np.sin(x[3])-x[5]*np.sin(270*np.pi/180)])    
    def 辅助连杆长(self):#c27
        辅助连杆长=np.sqrt((self.x20()-self.x30())**2+(self.y20()-self.y30())**2)
        return float(辅助连杆长)
    def 主连杆角度(self):#c17
        主连杆角度=np.arccos((self.连杆长度b**2+self.连杆长度g**2-self.辅助连杆长()**2)/(2*self.连杆长度b*self.连杆长度g))
        return 主连杆角度    
    def x20(self):#c23
        if  self.y10()>self.支点位置p:
            x20=-(-self.b0()-np.sqrt(self.b0()**2-4*self.a0()*self.c0()))/2/self.a0()
        else:x20=-(-self.b0()+np.sqrt(self.b0()**2-4*self.a0()*self.c0()))/2/self.a0()
        return x20
    def x30(self):#c25
        x30=(self.主齿轮偏心半径+self.连杆长度g)*self.受力点偏置距离/(self.主齿轮偏心半径+self.连杆长度g+self.连杆长度h)
        return x30
    def y30(self):#c26
        y30=-np.sqrt((self.主齿轮偏心半径+self.连杆长度g)**2-self.x30()**2)
        return y30
    def y20(self):#c24
        y20=self.n0()-self.f0()*self.x20()
        return y20
    def n0(self):#c49
        n0=(self.x10()**1-self.支点位置m**2+self.y10()**2-self.支点位置p**2-self.连杆长度b**2+self.连杆长度c**2)/2/(self.y10()-self.支点位置p)
        return n0
    def c0(self):#c52
        c0=self.x10()**2+(self.y10()-self.n0())**2-self.连杆长度b**2
        return c0
    def b0(self):#51
        b0=2*self.x10()-2*(self.y10()-self.n0())*self.f0()
        return  b0
    def f0(self):#c48
        f0=(self.x10()-self.支点位置m)/(self.y10()-self.支点位置p)
        return f0
    def a0(self):#c50
        a0=self.f0()**2+1
        return a0
    def x40(self):
        x40=self.受力点偏置距离
        return x40
    def y40(self):
        y40=-np.sqrt((self.主齿轮偏心半径+self.连杆长度g+self.连杆长度h)**2-self.x40()**2)
        return y40
    def bt(self):#c20
        bt=np.arctan(self.x40()/self.y40())
        return bt
    def x10(self):#c21
        x10=self.主齿轮偏心半径/(self.主齿轮偏心半径+self.连杆长度g+self.连杆长度h)*self.受力点偏置距离
        return x10
    def y10(self):#c22
        y10=-np.sqrt(self.主齿轮偏心半径**2-self.x10()**2)
        return y10
    def x20(self):#c23
        if  self.y10()>self.支点位置p:
            x20=-(-self.b0()-np.sqrt(self.b0()**2-4*self.a0()*self.c0()))/2/self.a0()
        else:x20=-(-self.b0()+np.sqrt(self.b0()**2-4*self.a0()*self.c0()))/2/self.a0()
        return x20
    def x30(self):#c25
        x30=(self.主齿轮偏心半径+self.连杆长度g)*self.受力点偏置距离/(self.主齿轮偏心半径+self.连杆长度g+self.连杆长度h)
        return x30
    def y30(self):#c26
        y30=-np.sqrt((self.主齿轮偏心半径+self.连杆长度g)**2-self.x30()**2)
        return y30
    def y20(self):#c24
        y20=self.n0()-self.f0()*self.x20()
        return y20
    def b2(self):
      #  b2=2*self.x1()-2*(self.y1()-K36)*J36
        return     

    
    def 解方程(self):
        sol3_fsolve = fsolve(self.位移方程,self.初始)
        return sol3_fsolve
    def 计算值(self):
        数据=pd.DataFrame()
        角度=np.linspace(np.pi/2,-3*np.pi/2,10001)#转换了起始位置和旋转方向
        时间=np.linspace(0,2*np.pi/self.角速度,10001)#时间
        #时间=np.linspace(0,2*np.pi/self.角速度,10001)#时间
        位移=np.linspace(0,2*np.pi,10001)
        for i in range(len(角度)):
            self.thea=角度[i]
            shuju=self.解方程()
            self.初始=shuju
            位移[i]=shuju[5]
        数据['角度弧度']=角度
        数据['角度']=(np.pi/2-角度)/np.pi*180    
        数据['位移']=位移
        最大位移=数据.loc[:,'位移'].max()
        距离下死点位置=最大位移-位移
        数据['距离下死点位置']=距离下死点位置
        行程=max(数据['距离下死点位置'])
        位移=数据['距离下死点位置']
        滑块速度=np.gradient(距离下死点位置,时间,edge_order=2)
        数据['滑块速度']=滑块速度
        滑块加速度=np.gradient(滑块速度,时间,edge_order=2)
        数据['滑块加速度']=滑块加速度
        stu = 数据.loc[数据['距离下死点位置'].apply(lambda a:(self.sf-0.05)<=a<=(self.sf+0.05))]
        print(stu)
        stu=stu.loc[stu['滑块速度']<0,'滑块速度']
        stu=stu.min()
        print(stu)
        v=abs(stu)
        pa=self.P_n*10000*v/1000
        Ms=pa/self.角速度
        Mq=Ms*1;#%偏心轴上的输入扭矩
        Pa=Mq*self.角速度*1000/(滑块速度*10000);
        数据['发生力']=-Pa
        数据.loc[数据['发生力']>self.P_n,'发生力']=self.P_n
        数据.loc[数据['发生力']<0,'发生力']=0
        return  Ms,数据,行程#m/s
    def 画图(self):
        dd=self.计算值()
        ms=dd[0]
        #plt.plot(数据['角度'],数据['距离下死点位置'])
        dd[1].to_csv('../数据文件/横置ML计算数据.txt', sep=' ', index=False)
        绘图(dd,self.sf,self.P_n)
        
        return ms           
if __name__=="__main__":
    #a=程序400t()#数据6
    #x1=a.主连杆角度()*180/np.pi
    #b=a.画图()
    '''b1=程序400t(冲压能力=1000,连续行程数=30,断续行程数小=10,断续行程数大=20, \
                 能力发生点=13,行程长=400,主齿轮偏心半径=150,支点位置m=1100,支点位置p=-100, \
                受力点偏置距离=0,连杆长度b=700,连杆长度c=810,连杆长度g=760,连杆长度h=810)#数据4
    b1.画图()'''
    '''数据3=程序400t(冲压能力=1000,连续行程数=30,断续行程数小=10,断续行程数大=20, \
                 能力发生点=8,行程长=400,主齿轮偏心半径=150,支点位置m=1200,支点位置p=-100, \
                受力点偏置距离=0,连杆长度b=893,连杆长度c=887,连杆长度g=993,连杆长度h=920)#数据3
    数据3.画图()'''

    数据3=程序400t(冲压能力=1000,连续行程数=30,断续行程数小=10,断续行程数大=20, \
                  能力发生点=13,行程长=900,主齿轮偏心半径=285,支点位置m=1200,支点位置p=-110, \
                 受力点偏置距离=0,连杆长度b=920,连杆长度c=800,连杆长度g=1030,连杆长度h=1150)#数据3
    dd=数据3.画图()
    zz=数据3.辅助连杆长()
   